Convert a Dynamic[] construct to a numerical list

Posted by Leo Alekseyev on Stack Overflow See other posts from Stack Overflow or by Leo Alekseyev
Published on 2010-05-06T02:06:52Z Indexed on 2010/05/06 2:08 UTC
Read the original article Hit count: 251

Filed under:

I have been trying to put together something that allows me to extract points from a ListPlot in order to use them in further computations. My current approach is to select points with a Locator[]. This works fine for displaying points, but I cannot figure out how to extract numerical values from a construct with head Dynamic[]. Below is a self-contained example. By dragging the gray locator, you should be able to select points (indicated by the pink locator and stored in q, a list of two elements). This is the second line below the plot. Now I would like to pass q[[2]] to a function, or perhaps simply display it. However, Mathematica treats q as a single entity with head Dynamic, and thus taking the second part is impossible (hence the error message). Can anyone shed light on how to convert q into a regular list?

EuclideanDistanceMod[p1_List, p2_List, fac_: {1, 1}] /; 
   Length[p1] == Length[p2] := 
  Plus @@ (fac.MapThread[Abs[#1 - #2]^2 &, {p1, p2}]) // Sqrt;
test1 = {{1.`, 6.340196001221532`}, {1.`, 
    13.78779876355869`}, {1.045`, 6.2634018978377295`}, {1.045`, 
    13.754947081416544`}, {1.09`, 6.178367702583522`}, {1.09`, 
    13.72055251752498`}, {1.135`, 1.8183153704413153`}, {1.135`, 
    6.082497198000075`}, {1.135`, 13.684582525399742`}, {1.18`, 
    1.6809452373465104`}, {1.18`, 5.971583107298081`}, {1.18`, 
    13.646996905469383`}, {1.225`, 1.9480537697339537`}, {1.225`, 
    5.838386922625636`}, {1.225`, 13.607746407088161`}, {1.27`, 
    2.1183174369679234`}, {1.27`, 5.669799095595362`}, {1.27`, 
    13.566771130126131`}, {1.315`, 2.2572975468163463`}, {1.315`, 
    5.444014254828522`}, {1.315`, 13.523998701347882`}, {1.36`, 
    2.380307009155079`}, {1.36`, 5.153024664297602`}, {1.36`, 
    13.479342200528283`}, {1.405`, 2.4941312539733285`}, {1.405`, 
    4.861423833512566`}, {1.405`, 13.432697814928654`}, {1.45`, 
    2.6028066447609426`}, {1.45`, 4.619367407525507`}, {1.45`, 
    13.383942212133244`}};
DynamicModule[{p = {1.2, 10}, q = {1.3, 11}},
 q := Dynamic@
   First@test1[[
     Ordering[{#, EuclideanDistanceMod[p, #, {1, .1}]} & /@ test1, 
      1, #1[[2]] < #2[[2]] &]]];
 Grid[{{Show[{ListPlot[test1, Frame -> True, ImageSize -> 300], 
      Graphics@Locator[Dynamic[p]], 
      Graphics@
       Locator[q, Appearance -> {Small}, 
        Background -> Pink]}]}, {Dynamic@p}, {q},{q[[2]]}}]]

© Stack Overflow or respective owner

Related posts about mathematica